#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>


using namespace std;

int main(){
    const char *name = "小明";
	int age = 18;
	float score[] = {88.5, 98, 58};

    cout << "序列化" << endl;
    //1、将数据保存在Json::Value对象中
    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);

    //2、使用Json::StreamWriter,Json::StreamWriterBuilder进行序列化
    //  virtual int write(Value const& root, std::ostream* sout) = 0;
    Json::StreamWriterBuilder swb;
    //用建造者建造Json::StreamWriter对象，保存在智能指针中
    unique_ptr<Json::StreamWriter> psw(swb.newStreamWriter());
    //创建流，用来保存序列化后的信息
    stringstream ss;
    //将信息序列化，并写入流
    psw->write(root, &ss);
    cout << ss.str() << endl;

    //string str = "{\"姓名\":\"小黑\",\"年龄\":19,\"成绩\":[58,59,61]}";
    //R"()" -- 括号内的数据转化成string，不用加转义字符
    string str = R"({"姓名":"小黑","年龄":19,"成绩":[58,59,61]})";
    cout << "反序列化" << endl;
    //1、定义一个Json::Value对象
    Json::Value rroot;

    //2、使用Json::CharReader,Json::CharReaderBuilder完成反序列化
    //   virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
    Json::CharReaderBuilder crb;
    unique_ptr<Json::CharReader> pcr(crb.newCharReader());
    string errstr;
    bool ret = pcr->parse(str.c_str(), str.c_str() + str.size(), &rroot, &errstr);
    if(ret == false){
        cout << "pares err" << endl;
        return -1;
    }
    cout << rroot["姓名"].asString() << endl;
    cout << rroot["年龄"].asInt() << endl;
    double sz = rroot["成绩"].size();
    for (int i = 0; i < sz;i++){
        cout << rroot["成绩"][i] << " ";
        
    }
    return 0;
}